The six reactive artifact types of IRP
IRPでは、Rxの概念を論理的に拡張・一般化した6つの反応型アーティファクトタイプを定義しています。アーティファクトタイプの最上位の区分は、ホットとコールドの区別です。
IRP defines six reactive artifact types which are logical extensions and generalizations of the Rx concepts. A top-level division of artifact types is the distinction between hot and cold.
コールドアーティファクトは、プログラミング言語のマクロのような定義に過ぎません。コールドアーティファクトは受動的で、常に「実行」されているわけではなく、他の定義やホットアーティファクトの文脈の中でバインド/インライン化することができます。
Cold artifacts are merely definitions akin to macros in programming languages. They’re passive, aren’t “running” all the time, and can be bound/inlined in the context of other definitions or hot artifacts.
ホットアーティファクトは動作しており、プログラミング言語のオブジェクトのインスタンスに例えられます。ホットアーティファクトは、アクティブで、ランタイムのライフサイクルを持ち、ステートフルである可能性があり、ホスティングインフラストラクチャによって維持される必要があります。
Hot artifacts are running and can be compared to instances of objects in a programming language. They’re active, have a runtime lifecycle, and can be stateful and have to be maintained by a hosting infrastructure.
この6つのアーティファクトタイプは、コールドアーティファクトタイプとホットアーティファクトタイプの対称性を持つ、リアクティブ処理の「標準モデル」を形成しています。コールドアーティファクトタイプは、(対応するホットな兄弟に対して)「定義」または「ファクトリ」と呼ばれることが多くあります。ホットアーティファクトは、常に実行される性質を強調するために、「プロセス」と呼ばれることがあります。
The six artifact types form a “Standard Model” for reactive processing with a symmetry between cold and hot artifact types. The cold artifact types are often referred to as “definitions” or “factories” (for their corresponding hot sibling). Hot artifacts are sometimes referred to as “processes” to reenforce their always-running nature.
Observableは、IObservable<T>に同型の(結果)型のコールド定義です。パラメーター化されたObservableの定義の例としては、WhereやSelectなどのクエリ演算子があります。また、イベントソースの例としては、接続文字列やトピックをパラメータとしたEventHub observableなどがあります。
Observables are cold definitions of a(result)type isomorphic to IObservable<T>. An example of a parameterized observable definition is a query operator, e.g. Where and Select. Another example is an event source, e.g. an “EventHub observable” parameterized on some connection string or a topic.
オブザーバは、IObserver<T>に同型の(結果)型のコールド定義です。パラメーター化されたオブザーバーの例としては、書き込むファイルのパスでパラメーター化された「ファイルオブザーバー」や、イベントのレシーバーとして動作する「EventHubオブザーバー」などがあります。
Observers are cold definitions of a (result) type isomorphic to IObserver<T>. An example of a parameterized observer is a “file observer” parameterized by the path of the file to write to, or an “EventHub observer” to act as a receiver for events.
サブスクリプションファクトリは、RxではIDisposable、IRPではISubscriptionに同型の(結果)型のコールド定義です。パラメータ化されたサブスクリプションファクトリの例は、Subscribeオペレーションそのもので、observableとobserverでパラメータ化されています。その他の例としては、複合サブスクリプション、「パラメータ化されたユーザー定義のクエリ」などがあります。
Subscription factories are cold definitions of a (result) type isomorphic to IDisposable in Rx, or ISubscription in IRP. An example of a parameterized subscription factory is the Subscribe operation itself, which is parameterized on an observable and an observer. Other examples are composite subscriptions, “parameterized user-defined queries”, etc.
サブスクリプションは、イベント処理とデータフローを実現するためにオブザーバとオブザーバを合成する、実行中のリアクティブな計算を表すホットアーティファクトです。
Subscriptions are hot artifacts that represent a running reactive computation which composes observables and observers to achieve event processing and data flow.
ストリームファクトリは、RxのISubject<T>と同型の(結果)型のコールド定義です。パラメータ化されたストリームファクトリの例としては、イベントの保持期間を示すパラメータを持つ「リプレイストリーム」があります(RxのReplaySubject<T>に似ています)。
Stream factories are cold definitions of a (result) type isomorphic to ISubject<T> in Rx. An example of a parameterized stream factory is a “replay stream” with a parameter indicating the retention duration for events (similar to ReplaySubject<T> in Rx).
ストリームは、アクティブなストリームを表すホットアーティファクトです。ストリームはobservable型とobserver型の両方に対応しているので、ソースとシンクの役割を果たすことができます。
Streams are hot artifacts that represent an active stream. Streams are compatible with both the observable and observer type, so they can act as sources and sinks.
table:The types of these artifacts are shown below, in the quoted asynchronous space with extrinsic identifiers (see above):
Artifact Rx type IRP type
Observable IObservable<T> IAsyncReactiveQbservable<T>
Observer IObserver<T> IAsyncReactiveQbserver<T>
Subscription factory Func<..., IDisposable> Func<..., IAsyncReactiveQubscription>
Subscription IDisposable IAsyncReactiveQubscription
Stream factory Func<..., ISubject<T>> Func<..., IAsyncReactiveQubject<T>>
Stream ISubject<T> IAsyncReactiveQubject<T>
なお、RxとIRPの間では、subjectがobservableとobserversの両方を継承するという型付け関係が維持されています。
Note that the typing relationship of subjects inheriting from both observables and observers is retained between Rx and IRP:
code:C#
interface ISubject<out T, in U> : IObservable<T>, IObserver<U> {}
interface IAsyncReactiveQubject<out T, in U> : IAsyncReactiveQbservable<T>, IAsyncReactiveQbserver<U> {}